home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / drm / drmP.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  43.4 KB  |  1,376 lines

  1. /**
  2.  * \file drmP.h
  3.  * Private header for Direct Rendering Manager
  4.  *
  5.  * \author Rickard E. (Rik) Faith <faith@valinux.com>
  6.  * \author Gareth Hughes <gareth@valinux.com>
  7.  */
  8.  
  9. /*
  10.  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
  11.  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
  12.  * All rights reserved.
  13.  *
  14.  * Permission is hereby granted, free of charge, to any person obtaining a
  15.  * copy of this software and associated documentation files (the "Software"),
  16.  * to deal in the Software without restriction, including without limitation
  17.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  18.  * and/or sell copies of the Software, and to permit persons to whom the
  19.  * Software is furnished to do so, subject to the following conditions:
  20.  *
  21.  * The above copyright notice and this permission notice (including the next
  22.  * paragraph) shall be included in all copies or substantial portions of the
  23.  * Software.
  24.  *
  25.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  26.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  27.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  28.  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  29.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  30.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  31.  * OTHER DEALINGS IN THE SOFTWARE.
  32.  */
  33.  
  34. #ifndef _DRM_P_H_
  35. #define _DRM_P_H_
  36.  
  37. /* If you want the memory alloc debug functionality, change define below */
  38. /* #define DEBUG_MEMORY */
  39.  
  40. #ifdef __KERNEL__
  41. #ifdef __alpha__
  42. /* add include of current.h so that "current" is defined
  43.  * before static inline funcs in wait.h. Doing this so we
  44.  * can build the DRM (part of PI DRI). 4/21/2000 S + B */
  45. #include <asm/current.h>
  46. #endif                /* __alpha__ */
  47. #include <linux/module.h>
  48. #include <linux/kernel.h>
  49. #include <linux/miscdevice.h>
  50. #include <linux/fs.h>
  51. #include <linux/proc_fs.h>
  52. #include <linux/init.h>
  53. #include <linux/file.h>
  54. #include <linux/pci.h>
  55. #include <linux/jiffies.h>
  56. #include <linux/smp_lock.h>    /* For (un)lock_kernel */
  57. #include <linux/dma-mapping.h>
  58. #include <linux/mm.h>
  59. #include <linux/cdev.h>
  60. #include <linux/mutex.h>
  61. #if defined(__alpha__) || defined(__powerpc__)
  62. #include <asm/pgtable.h>    /* For pte_wrprotect */
  63. #endif
  64. #include <asm/io.h>
  65. #include <asm/mman.h>
  66. #include <asm/uaccess.h>
  67. #ifdef CONFIG_MTRR
  68. #include <asm/mtrr.h>
  69. #endif
  70. #if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE)
  71. #include <linux/types.h>
  72. #include <linux/agp_backend.h>
  73. #endif
  74. #include <linux/workqueue.h>
  75. #include <linux/poll.h>
  76. #include <asm/pgalloc.h>
  77. #include "drm.h"
  78.  
  79. #include <linux/idr.h>
  80.  
  81. #define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE)))
  82. #define __OS_HAS_MTRR (defined(CONFIG_MTRR))
  83.  
  84. struct drm_file;
  85. struct drm_device;
  86.  
  87. #include "drm_os_linux.h"
  88. #include "drm_hashtab.h"
  89.  
  90. /***********************************************************************/
  91. /** \name DRM template customization defaults */
  92. /*@{*/
  93.  
  94. /* driver capabilities and requirements mask */
  95. #define DRIVER_USE_AGP     0x1
  96. #define DRIVER_REQUIRE_AGP 0x2
  97. #define DRIVER_USE_MTRR    0x4
  98. #define DRIVER_PCI_DMA     0x8
  99. #define DRIVER_SG          0x10
  100. #define DRIVER_HAVE_DMA    0x20
  101. #define DRIVER_HAVE_IRQ    0x40
  102. #define DRIVER_IRQ_SHARED  0x80
  103. #define DRIVER_IRQ_VBL     0x100
  104. #define DRIVER_DMA_QUEUE   0x200
  105. #define DRIVER_FB_DMA      0x400
  106. #define DRIVER_IRQ_VBL2    0x800
  107. #define DRIVER_GEM         0x1000
  108.  
  109. /***********************************************************************/
  110. /** \name Begin the DRM... */
  111. /*@{*/
  112.  
  113. #define DRM_DEBUG_CODE 2      /**< Include debugging code if > 1, then
  114.                      also include looping detection. */
  115.  
  116. #define DRM_MAGIC_HASH_ORDER  4  /**< Size of key hash table. Must be power of 2. */
  117. #define DRM_KERNEL_CONTEXT    0     /**< Change drm_resctx if changed */
  118. #define DRM_RESERVED_CONTEXTS 1     /**< Change drm_resctx if changed */
  119. #define DRM_LOOPING_LIMIT     5000000
  120. #define DRM_TIME_SLICE          (HZ/20)  /**< Time slice for GLXContexts */
  121. #define DRM_LOCK_SLICE          1    /**< Time slice for lock, in jiffies */
  122.  
  123. #define DRM_FLAG_DEBUG      0x01
  124.  
  125. #define DRM_MEM_DMA       0
  126. #define DRM_MEM_SAREA       1
  127. #define DRM_MEM_DRIVER       2
  128. #define DRM_MEM_MAGIC       3
  129. #define DRM_MEM_IOCTLS       4
  130. #define DRM_MEM_MAPS       5
  131. #define DRM_MEM_VMAS       6
  132. #define DRM_MEM_BUFS       7
  133. #define DRM_MEM_SEGS       8
  134. #define DRM_MEM_PAGES       9
  135. #define DRM_MEM_FILES      10
  136. #define DRM_MEM_QUEUES      11
  137. #define DRM_MEM_CMDS      12
  138. #define DRM_MEM_MAPPINGS  13
  139. #define DRM_MEM_BUFLISTS  14
  140. #define DRM_MEM_AGPLISTS  15
  141. #define DRM_MEM_TOTALAGP  16
  142. #define DRM_MEM_BOUNDAGP  17
  143. #define DRM_MEM_CTXBITMAP 18
  144. #define DRM_MEM_STUB      19
  145. #define DRM_MEM_SGLISTS   20
  146. #define DRM_MEM_CTXLIST   21
  147. #define DRM_MEM_MM        22
  148. #define DRM_MEM_HASHTAB   23
  149.  
  150. #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
  151. #define DRM_MAP_HASH_OFFSET 0x10000000
  152.  
  153. /*@}*/
  154.  
  155. /***********************************************************************/
  156. /** \name Macros to make printk easier */
  157. /*@{*/
  158.  
  159. /**
  160.  * Error output.
  161.  *
  162.  * \param fmt printf() like format string.
  163.  * \param arg arguments
  164.  */
  165. #define DRM_ERROR(fmt, arg...) \
  166.     printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __func__ , ##arg)
  167.  
  168. /**
  169.  * Memory error output.
  170.  *
  171.  * \param area memory area where the error occurred.
  172.  * \param fmt printf() like format string.
  173.  * \param arg arguments
  174.  */
  175. #define DRM_MEM_ERROR(area, fmt, arg...) \
  176.     printk(KERN_ERR "[" DRM_NAME ":%s:%s] *ERROR* " fmt , __func__, \
  177.            drm_mem_stats[area].name , ##arg)
  178.  
  179. #define DRM_INFO(fmt, arg...)  printk(KERN_INFO "[" DRM_NAME "] " fmt , ##arg)
  180.  
  181. /**
  182.  * Debug output.
  183.  *
  184.  * \param fmt printf() like format string.
  185.  * \param arg arguments
  186.  */
  187. #if DRM_DEBUG_CODE
  188. #define DRM_DEBUG(fmt, arg...)                        \
  189.     do {                                \
  190.         if ( drm_debug )            \
  191.             printk(KERN_DEBUG                \
  192.                    "[" DRM_NAME ":%s] " fmt ,    \
  193.                    __func__ , ##arg);            \
  194.     } while (0)
  195. #else
  196. #define DRM_DEBUG(fmt, arg...)         do { } while (0)
  197. #endif
  198.  
  199. #define DRM_PROC_LIMIT (PAGE_SIZE-80)
  200.  
  201. #define DRM_PROC_PRINT(fmt, arg...)                    \
  202.    len += sprintf(&buf[len], fmt , ##arg);                \
  203.    if (len > DRM_PROC_LIMIT) { *eof = 1; return len - offset; }
  204.  
  205. #define DRM_PROC_PRINT_RET(ret, fmt, arg...)                \
  206.    len += sprintf(&buf[len], fmt , ##arg);                \
  207.    if (len > DRM_PROC_LIMIT) { ret; *eof = 1; return len - offset; }
  208.  
  209. /*@}*/
  210.  
  211. /***********************************************************************/
  212. /** \name Internal types and structures */
  213. /*@{*/
  214.  
  215. #define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x)
  216.  
  217. #define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1))
  218. #define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x))
  219. #define DRM_WAITCOUNT(dev,idx) DRM_BUFCOUNT(&dev->queuelist[idx]->waitlist)
  220.  
  221. #define DRM_IF_VERSION(maj, min) (maj << 16 | min)
  222. /**
  223.  * Get the private SAREA mapping.
  224.  *
  225.  * \param _dev DRM device.
  226.  * \param _ctx context number.
  227.  * \param _map output mapping.
  228.  */
  229. #define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do {    \
  230.     (_map) = (_dev)->context_sareas[_ctx];        \
  231. } while(0)
  232.  
  233. /**
  234.  * Test that the hardware lock is held by the caller, returning otherwise.
  235.  *
  236.  * \param dev DRM device.
  237.  * \param filp file pointer of the caller.
  238.  */
  239. #define LOCK_TEST_WITH_RETURN( dev, file_priv )                \
  240. do {                                    \
  241.     if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||        \
  242.          dev->lock.file_priv != file_priv )    {            \
  243.         DRM_ERROR( "%s called without lock held, held  %d owner %p %p\n",\
  244.                __func__, _DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ),\
  245.                dev->lock.file_priv, file_priv );        \
  246.         return -EINVAL;                        \
  247.     }                                \
  248. } while (0)
  249.  
  250. /**
  251.  * Copy and IOCTL return string to user space
  252.  */
  253. #define DRM_COPY( name, value )                        \
  254.     len = strlen( value );                        \
  255.     if ( len > name##_len ) len = name##_len;            \
  256.     name##_len = strlen( value );                    \
  257.     if ( len && name ) {                        \
  258.         if ( copy_to_user( name, value, len ) )            \
  259.             return -EFAULT;                    \
  260.     }
  261.  
  262. /**
  263.  * Ioctl function type.
  264.  *
  265.  * \param inode device inode.
  266.  * \param file_priv DRM file private pointer.
  267.  * \param cmd command.
  268.  * \param arg argument.
  269.  */
  270. typedef int drm_ioctl_t(struct drm_device *dev, void *data,
  271.             struct drm_file *file_priv);
  272.  
  273. typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
  274.                    unsigned long arg);
  275.  
  276. #define DRM_AUTH    0x1
  277. #define    DRM_MASTER    0x2
  278. #define DRM_ROOT_ONLY    0x4
  279.  
  280. struct drm_ioctl_desc {
  281.     unsigned int cmd;
  282.     drm_ioctl_t *func;
  283.     int flags;
  284. };
  285.  
  286. /**
  287.  * Creates a driver or general drm_ioctl_desc array entry for the given
  288.  * ioctl, for use by drm_ioctl().
  289.  */
  290. #define DRM_IOCTL_DEF(ioctl, func, flags) \
  291.     [DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags}
  292.  
  293. struct drm_magic_entry {
  294.     struct list_head head;
  295.     struct drm_hash_item hash_item;
  296.     struct drm_file *priv;
  297. };
  298.  
  299. struct drm_vma_entry {
  300.     struct list_head head;
  301.     struct vm_area_struct *vma;
  302.     pid_t pid;
  303. };
  304.  
  305. /**
  306.  * DMA buffer.
  307.  */
  308. struct drm_buf {
  309.     int idx;               /**< Index into master buflist */
  310.     int total;               /**< Buffer size */
  311.     int order;               /**< log-base-2(total) */
  312.     int used;               /**< Amount of buffer in use (for DMA) */
  313.     unsigned long offset;           /**< Byte offset (used internally) */
  314.     void *address;               /**< Address of buffer */
  315.     unsigned long bus_address;     /**< Bus address of buffer */
  316.     struct drm_buf *next;           /**< Kernel-only: used for free list */
  317.     __volatile__ int waiting;      /**< On kernel DMA queue */
  318.     __volatile__ int pending;      /**< On hardware DMA queue */
  319.     wait_queue_head_t dma_wait;    /**< Processes waiting */
  320.     struct drm_file *file_priv;    /**< Private of holding file descr */
  321.     int context;               /**< Kernel queue for this buffer */
  322.     int while_locked;           /**< Dispatch this buffer while locked */
  323.     enum {
  324.         DRM_LIST_NONE = 0,
  325.         DRM_LIST_FREE = 1,
  326.         DRM_LIST_WAIT = 2,
  327.         DRM_LIST_PEND = 3,
  328.         DRM_LIST_PRIO = 4,
  329.         DRM_LIST_RECLAIM = 5
  330.     } list;                   /**< Which list we're on */
  331.  
  332.     int dev_priv_size;         /**< Size of buffer private storage */
  333.     void *dev_private;         /**< Per-buffer private storage */
  334. };
  335.  
  336. /** bufs is one longer than it has to be */
  337. struct drm_waitlist {
  338.     int count;            /**< Number of possible buffers */
  339.     struct drm_buf **bufs;        /**< List of pointers to buffers */
  340.     struct drm_buf **rp;            /**< Read pointer */
  341.     struct drm_buf **wp;            /**< Write pointer */
  342.     struct drm_buf **end;        /**< End pointer */
  343.     spinlock_t read_lock;
  344.     spinlock_t write_lock;
  345. };
  346.  
  347. struct drm_freelist {
  348.     int initialized;           /**< Freelist in use */
  349.     atomic_t count;               /**< Number of free buffers */
  350.     struct drm_buf *next;           /**< End pointer */
  351.  
  352.     wait_queue_head_t waiting;     /**< Processes waiting on free bufs */
  353.     int low_mark;               /**< Low water mark */
  354.     int high_mark;               /**< High water mark */
  355.     atomic_t wfh;               /**< If waiting for high mark */
  356.     spinlock_t lock;
  357. };
  358.  
  359. typedef struct drm_dma_handle {
  360.     dma_addr_t busaddr;
  361.     void *vaddr;
  362.     size_t size;
  363. } drm_dma_handle_t;
  364.  
  365. /**
  366.  * Buffer entry.  There is one of this for each buffer size order.
  367.  */
  368. struct drm_buf_entry {
  369.     int buf_size;            /**< size */
  370.     int buf_count;            /**< number of buffers */
  371.     struct drm_buf *buflist;        /**< buffer list */
  372.     int seg_count;
  373.     int page_order;
  374.     struct drm_dma_handle **seglist;
  375.  
  376.     struct drm_freelist freelist;
  377. };
  378.  
  379. /** File private data */
  380. struct drm_file {
  381.     int authenticated;
  382.     int master;
  383.     pid_t pid;
  384.     uid_t uid;
  385.     drm_magic_t magic;
  386.     unsigned long ioctl_count;
  387.     struct list_head lhead;
  388.     struct drm_minor *minor;
  389.     int remove_auth_on_close;
  390.     unsigned long lock_count;
  391.     /** Mapping of mm object handles to object pointers. */
  392.     struct idr object_idr;
  393.     /** Lock for synchronization of access to object_idr. */
  394.     spinlock_t table_lock;
  395.     struct file *filp;
  396.     void *driver_priv;
  397. };
  398.  
  399. /** Wait queue */
  400. struct drm_queue {
  401.     atomic_t use_count;        /**< Outstanding uses (+1) */
  402.     atomic_t finalization;        /**< Finalization in progress */
  403.     atomic_t block_count;        /**< Count of processes waiting */
  404.     atomic_t block_read;        /**< Queue blocked for reads */
  405.     wait_queue_head_t read_queue;    /**< Processes waiting on block_read */
  406.     atomic_t block_write;        /**< Queue blocked for writes */
  407.     wait_queue_head_t write_queue;    /**< Processes waiting on block_write */
  408.     atomic_t total_queued;        /**< Total queued statistic */
  409.     atomic_t total_flushed;        /**< Total flushes statistic */
  410.     atomic_t total_locks;        /**< Total locks statistics */
  411.     enum drm_ctx_flags flags;    /**< Context preserving and 2D-only */
  412.     struct drm_waitlist waitlist;    /**< Pending buffers */
  413.     wait_queue_head_t flush_queue;    /**< Processes waiting until flush */
  414. };
  415.  
  416. /**
  417.  * Lock data.
  418.  */
  419. struct drm_lock_data {
  420.     struct drm_hw_lock *hw_lock;    /**< Hardware lock */
  421.     /** Private of lock holder's file (NULL=kernel) */
  422.     struct drm_file *file_priv;
  423.     wait_queue_head_t lock_queue;    /**< Queue of blocked processes */
  424.     unsigned long lock_time;    /**< Time of last lock in jiffies */
  425.     spinlock_t spinlock;
  426.     uint32_t kernel_waiters;
  427.     uint32_t user_waiters;
  428.     int idle_has_lock;
  429. };
  430.  
  431. /**
  432.  * DMA data.
  433.  */
  434. struct drm_device_dma {
  435.  
  436.     struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];    /**< buffers, grouped by their size order */
  437.     int buf_count;            /**< total number of buffers */
  438.     struct drm_buf **buflist;        /**< Vector of pointers into drm_device_dma::bufs */
  439.     int seg_count;
  440.     int page_count;            /**< number of pages */
  441.     unsigned long *pagelist;    /**< page list */
  442.     unsigned long byte_count;
  443.     enum {
  444.         _DRM_DMA_USE_AGP = 0x01,
  445.         _DRM_DMA_USE_SG = 0x02,
  446.         _DRM_DMA_USE_FB = 0x04,
  447.         _DRM_DMA_USE_PCI_RO = 0x08
  448.     } flags;
  449.  
  450. };
  451.  
  452. /**
  453.  * AGP memory entry.  Stored as a doubly linked list.
  454.  */
  455. struct drm_agp_mem {
  456.     unsigned long handle;        /**< handle */
  457.     DRM_AGP_MEM *memory;
  458.     unsigned long bound;        /**< address */
  459.     int pages;
  460.     struct list_head head;
  461. };
  462.  
  463. /**
  464.  * AGP data.
  465.  *
  466.  * \sa drm_agp_init() and drm_device::agp.
  467.  */
  468. struct drm_agp_head {
  469.     DRM_AGP_KERN agp_info;        /**< AGP device information */
  470.     struct list_head memory;
  471.     unsigned long mode;        /**< AGP mode */
  472.     struct agp_bridge_data *bridge;
  473.     int enabled;            /**< whether the AGP bus as been enabled */
  474.     int acquired;            /**< whether the AGP device has been acquired */
  475.     unsigned long base;
  476.     int agp_mtrr;
  477.     int cant_use_aperture;
  478.     unsigned long page_mask;
  479. };
  480.  
  481. /**
  482.  * Scatter-gather memory.
  483.  */
  484. struct drm_sg_mem {
  485.     unsigned long handle;
  486.     void *virtual;
  487.     int pages;
  488.     struct page **pagelist;
  489.     dma_addr_t *busaddr;
  490. };
  491.  
  492. struct drm_sigdata {
  493.     int context;
  494.     struct drm_hw_lock *lock;
  495. };
  496.  
  497.  
  498. /*
  499.  * Generic memory manager structs
  500.  */
  501.  
  502. struct drm_mm_node {
  503.     struct list_head fl_entry;
  504.     struct list_head ml_entry;
  505.     int free;
  506.     unsigned long start;
  507.     unsigned long size;
  508.     struct drm_mm *mm;
  509.     void *private;
  510. };
  511.  
  512. struct drm_mm {
  513.     struct list_head fl_entry;
  514.     struct list_head ml_entry;
  515. };
  516.  
  517.  
  518. /**
  519.  * Mappings list
  520.  */
  521. struct drm_map_list {
  522.     struct list_head head;        /**< list head */
  523.     struct drm_hash_item hash;
  524.     struct drm_map *map;            /**< mapping */
  525.     uint64_t user_token;
  526. };
  527.  
  528. typedef struct drm_map drm_local_map_t;
  529.  
  530. /**
  531.  * Context handle list
  532.  */
  533. struct drm_ctx_list {
  534.     struct list_head head;        /**< list head */
  535.     drm_context_t handle;        /**< context handle */
  536.     struct drm_file *tag;        /**< associated fd private data */
  537. };
  538.  
  539. struct drm_vbl_sig {
  540.     struct list_head head;
  541.     unsigned int sequence;
  542.     struct siginfo info;
  543.     struct task_struct *task;
  544. };
  545.  
  546. /* location of GART table */
  547. #define DRM_ATI_GART_MAIN 1
  548. #define DRM_ATI_GART_FB   2
  549.  
  550. #define DRM_ATI_GART_PCI 1
  551. #define DRM_ATI_GART_PCIE 2
  552. #define DRM_ATI_GART_IGP 3
  553.  
  554. struct drm_ati_pcigart_info {
  555.     int gart_table_location;
  556.     int gart_reg_if;
  557.     void *addr;
  558.     dma_addr_t bus_addr;
  559.     dma_addr_t table_mask;
  560.     struct drm_dma_handle *table_handle;
  561.     drm_local_map_t mapping;
  562.     int table_size;
  563. };
  564.  
  565. /**
  566.  * This structure defines the drm_mm memory object, which will be used by the
  567.  * DRM for its buffer objects.
  568.  */
  569. struct drm_gem_object {
  570.     /** Reference count of this object */
  571.     struct kref refcount;
  572.  
  573.     /** Handle count of this object. Each handle also holds a reference */
  574.     struct kref handlecount;
  575.  
  576.     /** Related drm device */
  577.     struct drm_device *dev;
  578.  
  579.     /** File representing the shmem storage */
  580.     struct file *filp;
  581.  
  582.     /**
  583.      * Size of the object, in bytes.  Immutable over the object's
  584.      * lifetime.
  585.      */
  586.     size_t size;
  587.  
  588.     /**
  589.      * Global name for this object, starts at 1. 0 means unnamed.
  590.      * Access is covered by the object_name_lock in the related drm_device
  591.      */
  592.     int name;
  593.  
  594.     /**
  595.      * Memory domains. These monitor which caches contain read/write data
  596.      * related to the object. When transitioning from one set of domains
  597.      * to another, the driver is called to ensure that caches are suitably
  598.      * flushed and invalidated
  599.      */
  600.     uint32_t read_domains;
  601.     uint32_t write_domain;
  602.  
  603.     /**
  604.      * While validating an exec operation, the
  605.      * new read/write domain values are computed here.
  606.      * They will be transferred to the above values
  607.      * at the point that any cache flushing occurs
  608.      */
  609.     uint32_t pending_read_domains;
  610.     uint32_t pending_write_domain;
  611.  
  612.     void *driver_private;
  613. };
  614.  
  615. /**
  616.  * DRM driver structure. This structure represent the common code for
  617.  * a family of cards. There will one drm_device for each card present
  618.  * in this family
  619.  */
  620. struct drm_driver {
  621.     int (*load) (struct drm_device *, unsigned long flags);
  622.     int (*firstopen) (struct drm_device *);
  623.     int (*open) (struct drm_device *, struct drm_file *);
  624.     void (*preclose) (struct drm_device *, struct drm_file *file_priv);
  625.     void (*postclose) (struct drm_device *, struct drm_file *);
  626.     void (*lastclose) (struct drm_device *);
  627.     int (*unload) (struct drm_device *);
  628.     int (*suspend) (struct drm_device *, pm_message_t state);
  629.     int (*resume) (struct drm_device *);
  630.     int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
  631.     void (*dma_ready) (struct drm_device *);
  632.     int (*dma_quiescent) (struct drm_device *);
  633.     int (*context_ctor) (struct drm_device *dev, int context);
  634.     int (*context_dtor) (struct drm_device *dev, int context);
  635.     int (*kernel_context_switch) (struct drm_device *dev, int old,
  636.                       int new);
  637.     void (*kernel_context_switch_unlock) (struct drm_device *dev);
  638.     int (*dri_library_name) (struct drm_device *dev, char *buf);
  639.  
  640.     /**
  641.      * get_vblank_counter - get raw hardware vblank counter
  642.      * @dev: DRM device
  643.      * @crtc: counter to fetch
  644.      *
  645.      * Driver callback for fetching a raw hardware vblank counter
  646.      * for @crtc.  If a device doesn't have a hardware counter, the
  647.      * driver can simply return the value of drm_vblank_count and
  648.      * make the enable_vblank() and disable_vblank() hooks into no-ops,
  649.      * leaving interrupts enabled at all times.
  650.      *
  651.      * Wraparound handling and loss of events due to modesetting is dealt
  652.      * with in the DRM core code.
  653.      *
  654.      * RETURNS
  655.      * Raw vblank counter value.
  656.      */
  657.     u32 (*get_vblank_counter) (struct drm_device *dev, int crtc);
  658.  
  659.     /**
  660.      * enable_vblank - enable vblank interrupt events
  661.      * @dev: DRM device
  662.      * @crtc: which irq to enable
  663.      *
  664.      * Enable vblank interrupts for @crtc.  If the device doesn't have
  665.      * a hardware vblank counter, this routine should be a no-op, since
  666.      * interrupts will have to stay on to keep the count accurate.
  667.      *
  668.      * RETURNS
  669.      * Zero on success, appropriate errno if the given @crtc's vblank
  670.      * interrupt cannot be enabled.
  671.      */
  672.     int (*enable_vblank) (struct drm_device *dev, int crtc);
  673.  
  674.     /**
  675.      * disable_vblank - disable vblank interrupt events
  676.      * @dev: DRM device
  677.      * @crtc: which irq to enable
  678.      *
  679.      * Disable vblank interrupts for @crtc.  If the device doesn't have
  680.      * a hardware vblank counter, this routine should be a no-op, since
  681.      * interrupts will have to stay on to keep the count accurate.
  682.      */
  683.     void (*disable_vblank) (struct drm_device *dev, int crtc);
  684.  
  685.     /**
  686.      * Called by \c drm_device_is_agp.  Typically used to determine if a
  687.      * card is really attached to AGP or not.
  688.      *
  689.      * \param dev  DRM device handle
  690.      *
  691.      * \returns
  692.      * One of three values is returned depending on whether or not the
  693.      * card is absolutely \b not AGP (return of 0), absolutely \b is AGP
  694.      * (return of 1), or may or may not be AGP (return of 2).
  695.      */
  696.     int (*device_is_agp) (struct drm_device *dev);
  697.  
  698.     /* these have to be filled in */
  699.  
  700.     irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
  701.     void (*irq_preinstall) (struct drm_device *dev);
  702.     int (*irq_postinstall) (struct drm_device *dev);
  703.     void (*irq_uninstall) (struct drm_device *dev);
  704.     void (*reclaim_buffers) (struct drm_device *dev,
  705.                  struct drm_file * file_priv);
  706.     void (*reclaim_buffers_locked) (struct drm_device *dev,
  707.                     struct drm_file *file_priv);
  708.     void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
  709.                         struct drm_file *file_priv);
  710.     unsigned long (*get_map_ofs) (struct drm_map * map);
  711.     unsigned long (*get_reg_ofs) (struct drm_device *dev);
  712.     void (*set_version) (struct drm_device *dev,
  713.                  struct drm_set_version *sv);
  714.  
  715.     int (*proc_init)(struct drm_minor *minor);
  716.     void (*proc_cleanup)(struct drm_minor *minor);
  717.  
  718.     /**
  719.      * Driver-specific constructor for drm_gem_objects, to set up
  720.      * obj->driver_private.
  721.      *
  722.      * Returns 0 on success.
  723.      */
  724.     int (*gem_init_object) (struct drm_gem_object *obj);
  725.     void (*gem_free_object) (struct drm_gem_object *obj);
  726.  
  727.     int major;
  728.     int minor;
  729.     int patchlevel;
  730.     char *name;
  731.     char *desc;
  732.     char *date;
  733.  
  734.     u32 driver_features;
  735.     int dev_priv_size;
  736.     struct drm_ioctl_desc *ioctls;
  737.     int num_ioctls;
  738.     struct file_operations fops;
  739.     struct pci_driver pci_driver;
  740. };
  741.  
  742. #define DRM_MINOR_UNASSIGNED 0
  743. #define DRM_MINOR_LEGACY 1
  744.  
  745. /**
  746.  * DRM minor structure. This structure represents a drm minor number.
  747.  */
  748. struct drm_minor {
  749.     int index;            /**< Minor device number */
  750.     int type;                       /**< Control or render */
  751.     dev_t device;            /**< Device number for mknod */
  752.     struct device kdev;        /**< Linux device */
  753.     struct drm_device *dev;
  754.     struct proc_dir_entry *dev_root;  /**< proc directory entry */
  755. };
  756.  
  757. /**
  758.  * DRM device structure. This structure represent a complete card that
  759.  * may contain multiple heads.
  760.  */
  761. struct drm_device {
  762.     char *unique;            /**< Unique identifier: e.g., busid */
  763.     int unique_len;            /**< Length of unique field */
  764.     char *devname;            /**< For /proc/interrupts */
  765.     int if_version;            /**< Highest interface version set */
  766.  
  767.     int blocked;            /**< Blocked due to VC switch? */
  768.  
  769.     /** \name Locks */
  770.     /*@{ */
  771.     spinlock_t count_lock;        /**< For inuse, drm_device::open_count, drm_device::buf_use */
  772.     struct mutex struct_mutex;    /**< For others */
  773.     /*@} */
  774.  
  775.     /** \name Usage Counters */
  776.     /*@{ */
  777.     int open_count;            /**< Outstanding files open */
  778.     atomic_t ioctl_count;        /**< Outstanding IOCTLs pending */
  779.     atomic_t vma_count;        /**< Outstanding vma areas open */
  780.     int buf_use;            /**< Buffers in use -- cannot alloc */
  781.     atomic_t buf_alloc;        /**< Buffer allocation in progress */
  782.     /*@} */
  783.  
  784.     /** \name Performance counters */
  785.     /*@{ */
  786.     unsigned long counters;
  787.     enum drm_stat_type types[15];
  788.     atomic_t counts[15];
  789.     /*@} */
  790.  
  791.     /** \name Authentication */
  792.     /*@{ */
  793.     struct list_head filelist;
  794.     struct drm_open_hash magiclist;    /**< magic hash table */
  795.     struct list_head magicfree;
  796.     /*@} */
  797.  
  798.     /** \name Memory management */
  799.     /*@{ */
  800.     struct list_head maplist;    /**< Linked list of regions */
  801.     int map_count;            /**< Number of mappable regions */
  802.     struct drm_open_hash map_hash;    /**< User token hash table for maps */
  803.  
  804.     /** \name Context handle management */
  805.     /*@{ */
  806.     struct list_head ctxlist;    /**< Linked list of context handles */
  807.     int ctx_count;            /**< Number of context handles */
  808.     struct mutex ctxlist_mutex;    /**< For ctxlist */
  809.  
  810.     struct idr ctx_idr;
  811.  
  812.     struct list_head vmalist;    /**< List of vmas (for debugging) */
  813.     struct drm_lock_data lock;    /**< Information on hardware lock */
  814.     /*@} */
  815.  
  816.     /** \name DMA queues (contexts) */
  817.     /*@{ */
  818.     int queue_count;        /**< Number of active DMA queues */
  819.     int queue_reserved;          /**< Number of reserved DMA queues */
  820.     int queue_slots;        /**< Actual length of queuelist */
  821.     struct drm_queue **queuelist;    /**< Vector of pointers to DMA queues */
  822.     struct drm_device_dma *dma;        /**< Optional pointer for DMA support */
  823.     /*@} */
  824.  
  825.     /** \name Context support */
  826.     /*@{ */
  827.     int irq_enabled;        /**< True if irq handler is enabled */
  828.     __volatile__ long context_flag;    /**< Context swapping flag */
  829.     __volatile__ long interrupt_flag; /**< Interruption handler flag */
  830.     __volatile__ long dma_flag;    /**< DMA dispatch flag */
  831.     struct timer_list timer;    /**< Timer for delaying ctx switch */
  832.     wait_queue_head_t context_wait;    /**< Processes waiting on ctx switch */
  833.     int last_checked;        /**< Last context checked for DMA */
  834.     int last_context;        /**< Last current context */
  835.     unsigned long last_switch;    /**< jiffies at last context switch */
  836.     /*@} */
  837.  
  838.     struct work_struct work;
  839.     /** \name VBLANK IRQ support */
  840.     /*@{ */
  841.  
  842.     /*
  843.      * At load time, disabling the vblank interrupt won't be allowed since
  844.      * old clients may not call the modeset ioctl and therefore misbehave.
  845.      * Once the modeset ioctl *has* been called though, we can safely
  846.      * disable them when unused.
  847.      */
  848.     int vblank_disable_allowed;
  849.  
  850.     wait_queue_head_t *vbl_queue;   /**< VBLANK wait queue */
  851.     atomic_t *_vblank_count;        /**< number of VBLANK interrupts (driver must alloc the right number of counters) */
  852.     spinlock_t vbl_lock;
  853.     struct list_head *vbl_sigs;    /**< signal list to send on VBLANK */
  854.     atomic_t vbl_signal_pending;    /* number of signals pending on all crtcs*/
  855.     atomic_t *vblank_refcount;      /* number of users of vblank interruptsper crtc */
  856.     u32 *last_vblank;               /* protected by dev->vbl_lock, used */
  857.                     /* for wraparound handling */
  858.     int *vblank_enabled;            /* so we don't call enable more than
  859.                        once per disable */
  860.     int *vblank_inmodeset;          /* Display driver is setting mode */
  861.     struct timer_list vblank_disable_timer;
  862.  
  863.     u32 max_vblank_count;           /**< size of vblank counter register */
  864.  
  865.     /*@} */
  866.     cycles_t ctx_start;
  867.     cycles_t lck_start;
  868.  
  869.     struct fasync_struct *buf_async;/**< Processes waiting for SIGIO */
  870.     wait_queue_head_t buf_readers;    /**< Processes waiting to read */
  871.     wait_queue_head_t buf_writers;    /**< Processes waiting to ctx switch */
  872.  
  873.     struct drm_agp_head *agp;    /**< AGP data */
  874.  
  875.     struct pci_dev *pdev;        /**< PCI device structure */
  876.     int pci_vendor;            /**< PCI vendor id */
  877.     int pci_device;            /**< PCI device id */
  878. #ifdef __alpha__
  879.     struct pci_controller *hose;
  880. #endif
  881.     struct drm_sg_mem *sg;    /**< Scatter gather memory */
  882.     int num_crtcs;                  /**< Number of CRTCs on this device */
  883.     void *dev_private;        /**< device private data */
  884.     struct drm_sigdata sigdata;       /**< For block_all_signals */
  885.     sigset_t sigmask;
  886.  
  887.     struct drm_driver *driver;
  888.     drm_local_map_t *agp_buffer_map;
  889.     unsigned int agp_buffer_token;
  890.     struct drm_minor *primary;        /**< render type primary screen head */
  891.  
  892.     /** \name Drawable information */
  893.     /*@{ */
  894.     spinlock_t drw_lock;
  895.     struct idr drw_idr;
  896.     /*@} */
  897.  
  898.     /** \name GEM information */
  899.     /*@{ */
  900.     spinlock_t object_name_lock;
  901.     struct idr object_name_idr;
  902.     atomic_t object_count;
  903.     atomic_t object_memory;
  904.     atomic_t pin_count;
  905.     atomic_t pin_memory;
  906.     atomic_t gtt_count;
  907.     atomic_t gtt_memory;
  908.     uint32_t gtt_total;
  909.     uint32_t invalidate_domains;    /* domains pending invalidation */
  910.     uint32_t flush_domains;         /* domains pending flush */
  911.     /*@} */
  912.  
  913. };
  914.  
  915. static inline int drm_dev_to_irq(struct drm_device *dev)
  916. {
  917.     return dev->pdev->irq;
  918. }
  919.  
  920. static __inline__ int drm_core_check_feature(struct drm_device *dev,
  921.                          int feature)
  922. {
  923.     return ((dev->driver->driver_features & feature) ? 1 : 0);
  924. }
  925.  
  926. #ifdef __alpha__
  927. #define drm_get_pci_domain(dev) dev->hose->index
  928. #else
  929. #define drm_get_pci_domain(dev) 0
  930. #endif
  931.  
  932. #if __OS_HAS_AGP
  933. static inline int drm_core_has_AGP(struct drm_device *dev)
  934. {
  935.     return drm_core_check_feature(dev, DRIVER_USE_AGP);
  936. }
  937. #else
  938. #define drm_core_has_AGP(dev) (0)
  939. #endif
  940.  
  941. #if __OS_HAS_MTRR
  942. static inline int drm_core_has_MTRR(struct drm_device *dev)
  943. {
  944.     return drm_core_check_feature(dev, DRIVER_USE_MTRR);
  945. }
  946.  
  947. #define DRM_MTRR_WC        MTRR_TYPE_WRCOMB
  948.  
  949. static inline int drm_mtrr_add(unsigned long offset, unsigned long size,
  950.                    unsigned int flags)
  951. {
  952.     return mtrr_add(offset, size, flags, 1);
  953. }
  954.  
  955. static inline int drm_mtrr_del(int handle, unsigned long offset,
  956.                    unsigned long size, unsigned int flags)
  957. {
  958.     return mtrr_del(handle, offset, size);
  959. }
  960.  
  961. #else
  962. #define drm_core_has_MTRR(dev) (0)
  963.  
  964. #define DRM_MTRR_WC        0
  965.  
  966. static inline int drm_mtrr_add(unsigned long offset, unsigned long size,
  967.                    unsigned int flags)
  968. {
  969.     return 0;
  970. }
  971.  
  972. static inline int drm_mtrr_del(int handle, unsigned long offset,
  973.                    unsigned long size, unsigned int flags)
  974. {
  975.     return 0;
  976. }
  977. #endif
  978.  
  979. /******************************************************************/
  980. /** \name Internal function definitions */
  981. /*@{*/
  982.  
  983.                 /* Driver support (drm_drv.h) */
  984. extern int drm_init(struct drm_driver *driver);
  985. extern void drm_exit(struct drm_driver *driver);
  986. extern int drm_ioctl(struct inode *inode, struct file *filp,
  987.              unsigned int cmd, unsigned long arg);
  988. extern long drm_compat_ioctl(struct file *filp,
  989.                  unsigned int cmd, unsigned long arg);
  990. extern int drm_lastclose(struct drm_device *dev);
  991.  
  992.                 /* Device support (drm_fops.h) */
  993. extern int drm_open(struct inode *inode, struct file *filp);
  994. extern int drm_stub_open(struct inode *inode, struct file *filp);
  995. extern int drm_fasync(int fd, struct file *filp, int on);
  996. extern int drm_release(struct inode *inode, struct file *filp);
  997.  
  998.                 /* Mapping support (drm_vm.h) */
  999. extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
  1000. extern unsigned long drm_core_get_map_ofs(struct drm_map * map);
  1001. extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev);
  1002. extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
  1003.  
  1004.                 /* Memory management support (drm_memory.h) */
  1005. #include "drm_memory.h"
  1006. extern void drm_mem_init(void);
  1007. extern int drm_mem_info(char *buf, char **start, off_t offset,
  1008.             int request, int *eof, void *data);
  1009. extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area);
  1010.  
  1011. extern DRM_AGP_MEM *drm_alloc_agp(struct drm_device *dev, int pages, u32 type);
  1012. extern int drm_free_agp(DRM_AGP_MEM * handle, int pages);
  1013. extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start);
  1014. extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev,
  1015.                        struct page **pages,
  1016.                        unsigned long num_pages,
  1017.                        uint32_t gtt_offset,
  1018.                        uint32_t type);
  1019. extern int drm_unbind_agp(DRM_AGP_MEM * handle);
  1020.  
  1021.                 /* Misc. IOCTL support (drm_ioctl.h) */
  1022. extern int drm_irq_by_busid(struct drm_device *dev, void *data,
  1023.                 struct drm_file *file_priv);
  1024. extern int drm_getunique(struct drm_device *dev, void *data,
  1025.              struct drm_file *file_priv);
  1026. extern int drm_setunique(struct drm_device *dev, void *data,
  1027.              struct drm_file *file_priv);
  1028. extern int drm_getmap(struct drm_device *dev, void *data,
  1029.               struct drm_file *file_priv);
  1030. extern int drm_getclient(struct drm_device *dev, void *data,
  1031.              struct drm_file *file_priv);
  1032. extern int drm_getstats(struct drm_device *dev, void *data,
  1033.             struct drm_file *file_priv);
  1034. extern int drm_setversion(struct drm_device *dev, void *data,
  1035.               struct drm_file *file_priv);
  1036. extern int drm_noop(struct drm_device *dev, void *data,
  1037.             struct drm_file *file_priv);
  1038.  
  1039.                 /* Context IOCTL support (drm_context.h) */
  1040. extern int drm_resctx(struct drm_device *dev, void *data,
  1041.               struct drm_file *file_priv);
  1042. extern int drm_addctx(struct drm_device *dev, void *data,
  1043.               struct drm_file *file_priv);
  1044. extern int drm_modctx(struct drm_device *dev, void *data,
  1045.               struct drm_file *file_priv);
  1046. extern int drm_getctx(struct drm_device *dev, void *data,
  1047.               struct drm_file *file_priv);
  1048. extern int drm_switchctx(struct drm_device *dev, void *data,
  1049.              struct drm_file *file_priv);
  1050. extern int drm_newctx(struct drm_device *dev, void *data,
  1051.               struct drm_file *file_priv);
  1052. extern int drm_rmctx(struct drm_device *dev, void *data,
  1053.              struct drm_file *file_priv);
  1054.  
  1055. extern int drm_ctxbitmap_init(struct drm_device *dev);
  1056. extern void drm_ctxbitmap_cleanup(struct drm_device *dev);
  1057. extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
  1058.  
  1059. extern int drm_setsareactx(struct drm_device *dev, void *data,
  1060.                struct drm_file *file_priv);
  1061. extern int drm_getsareactx(struct drm_device *dev, void *data,
  1062.                struct drm_file *file_priv);
  1063.  
  1064.                 /* Drawable IOCTL support (drm_drawable.h) */
  1065. extern int drm_adddraw(struct drm_device *dev, void *data,
  1066.                struct drm_file *file_priv);
  1067. extern int drm_rmdraw(struct drm_device *dev, void *data,
  1068.               struct drm_file *file_priv);
  1069. extern int drm_update_drawable_info(struct drm_device *dev, void *data,
  1070.                     struct drm_file *file_priv);
  1071. extern struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev,
  1072.                           drm_drawable_t id);
  1073. extern void drm_drawable_free_all(struct drm_device *dev);
  1074.  
  1075.                 /* Authentication IOCTL support (drm_auth.h) */
  1076. extern int drm_getmagic(struct drm_device *dev, void *data,
  1077.             struct drm_file *file_priv);
  1078. extern int drm_authmagic(struct drm_device *dev, void *data,
  1079.              struct drm_file *file_priv);
  1080.  
  1081. /* Cache management (drm_cache.c) */
  1082. void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
  1083.  
  1084.                 /* Locking IOCTL support (drm_lock.h) */
  1085. extern int drm_lock(struct drm_device *dev, void *data,
  1086.             struct drm_file *file_priv);
  1087. extern int drm_unlock(struct drm_device *dev, void *data,
  1088.               struct drm_file *file_priv);
  1089. extern int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context);
  1090. extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context);
  1091. extern void drm_idlelock_take(struct drm_lock_data *lock_data);
  1092. extern void drm_idlelock_release(struct drm_lock_data *lock_data);
  1093.  
  1094. /*
  1095.  * These are exported to drivers so that they can implement fencing using
  1096.  * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
  1097.  */
  1098.  
  1099. extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv);
  1100.  
  1101.                 /* Buffer management support (drm_bufs.h) */
  1102. extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request);
  1103. extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request);
  1104. extern int drm_addmap(struct drm_device *dev, unsigned int offset,
  1105.               unsigned int size, enum drm_map_type type,
  1106.               enum drm_map_flags flags, drm_local_map_t ** map_ptr);
  1107. extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
  1108.                 struct drm_file *file_priv);
  1109. extern int drm_rmmap(struct drm_device *dev, drm_local_map_t *map);
  1110. extern int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map);
  1111. extern int drm_rmmap_ioctl(struct drm_device *dev, void *data,
  1112.                struct drm_file *file_priv);
  1113. extern int drm_addbufs(struct drm_device *dev, void *data,
  1114.                struct drm_file *file_priv);
  1115. extern int drm_infobufs(struct drm_device *dev, void *data,
  1116.             struct drm_file *file_priv);
  1117. extern int drm_markbufs(struct drm_device *dev, void *data,
  1118.             struct drm_file *file_priv);
  1119. extern int drm_freebufs(struct drm_device *dev, void *data,
  1120.             struct drm_file *file_priv);
  1121. extern int drm_mapbufs(struct drm_device *dev, void *data,
  1122.                struct drm_file *file_priv);
  1123. extern int drm_order(unsigned long size);
  1124. extern unsigned long drm_get_resource_start(struct drm_device *dev,
  1125.                         unsigned int resource);
  1126. extern unsigned long drm_get_resource_len(struct drm_device *dev,
  1127.                       unsigned int resource);
  1128.  
  1129.                 /* DMA support (drm_dma.h) */
  1130. extern int drm_dma_setup(struct drm_device *dev);
  1131. extern void drm_dma_takedown(struct drm_device *dev);
  1132. extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);
  1133. extern void drm_core_reclaim_buffers(struct drm_device *dev,
  1134.                      struct drm_file *filp);
  1135.  
  1136.                 /* IRQ support (drm_irq.h) */
  1137. extern int drm_control(struct drm_device *dev, void *data,
  1138.                struct drm_file *file_priv);
  1139. extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS);
  1140. extern int drm_irq_install(struct drm_device *dev);
  1141. extern int drm_irq_uninstall(struct drm_device *dev);
  1142. extern void drm_driver_irq_preinstall(struct drm_device *dev);
  1143. extern void drm_driver_irq_postinstall(struct drm_device *dev);
  1144. extern void drm_driver_irq_uninstall(struct drm_device *dev);
  1145.  
  1146. extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
  1147. extern int drm_wait_vblank(struct drm_device *dev, void *data,
  1148.                struct drm_file *filp);
  1149. extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
  1150. extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
  1151. extern void drm_handle_vblank(struct drm_device *dev, int crtc);
  1152. extern int drm_vblank_get(struct drm_device *dev, int crtc);
  1153. extern void drm_vblank_put(struct drm_device *dev, int crtc);
  1154. extern void drm_vblank_cleanup(struct drm_device *dev);
  1155. /* Modesetting support */
  1156. extern int drm_modeset_ctl(struct drm_device *dev, void *data,
  1157.                struct drm_file *file_priv);
  1158.  
  1159.                 /* AGP/GART support (drm_agpsupport.h) */
  1160. extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
  1161. extern int drm_agp_acquire(struct drm_device *dev);
  1162. extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
  1163.                  struct drm_file *file_priv);
  1164. extern int drm_agp_release(struct drm_device *dev);
  1165. extern int drm_agp_release_ioctl(struct drm_device *dev, void *data,
  1166.                  struct drm_file *file_priv);
  1167. extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
  1168. extern int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
  1169.                 struct drm_file *file_priv);
  1170. extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
  1171. extern int drm_agp_info_ioctl(struct drm_device *dev, void *data,
  1172.             struct drm_file *file_priv);
  1173. extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
  1174. extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
  1175.              struct drm_file *file_priv);
  1176. extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
  1177. extern int drm_agp_free_ioctl(struct drm_device *dev, void *data,
  1178.             struct drm_file *file_priv);
  1179. extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
  1180. extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
  1181.               struct drm_file *file_priv);
  1182. extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
  1183. extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
  1184.             struct drm_file *file_priv);
  1185. extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type);
  1186. extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
  1187. extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
  1188. extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
  1189. extern void drm_agp_chipset_flush(struct drm_device *dev);
  1190.  
  1191.                 /* Stub support (drm_stub.h) */
  1192. extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
  1193.                struct drm_driver *driver);
  1194. extern int drm_put_dev(struct drm_device *dev);
  1195. extern int drm_put_minor(struct drm_minor **minor);
  1196. extern unsigned int drm_debug;
  1197.  
  1198. extern struct class *drm_class;
  1199. extern struct proc_dir_entry *drm_proc_root;
  1200.  
  1201. extern struct idr drm_minors_idr;
  1202.  
  1203. extern drm_local_map_t *drm_getsarea(struct drm_device *dev);
  1204.  
  1205.                 /* Proc support (drm_proc.h) */
  1206. extern int drm_proc_init(struct drm_minor *minor, int minor_id,
  1207.              struct proc_dir_entry *root);
  1208. extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root);
  1209.  
  1210.                 /* Scatter Gather Support (drm_scatter.h) */
  1211. extern void drm_sg_cleanup(struct drm_sg_mem * entry);
  1212. extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
  1213.             struct drm_file *file_priv);
  1214. extern int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request);
  1215. extern int drm_sg_free(struct drm_device *dev, void *data,
  1216.                struct drm_file *file_priv);
  1217.  
  1218.                    /* ATI PCIGART support (ati_pcigart.h) */
  1219. extern int drm_ati_pcigart_init(struct drm_device *dev,
  1220.                 struct drm_ati_pcigart_info * gart_info);
  1221. extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
  1222.                    struct drm_ati_pcigart_info * gart_info);
  1223.  
  1224. extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
  1225.                        size_t align, dma_addr_t maxaddr);
  1226. extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
  1227. extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
  1228.  
  1229.                    /* sysfs support (drm_sysfs.c) */
  1230. struct drm_sysfs_class;
  1231. extern struct class *drm_sysfs_create(struct module *owner, char *name);
  1232. extern void drm_sysfs_destroy(void);
  1233. extern int drm_sysfs_device_add(struct drm_minor *minor);
  1234. extern void drm_sysfs_device_remove(struct drm_minor *minor);
  1235.  
  1236. /*
  1237.  * Basic memory manager support (drm_mm.c)
  1238.  */
  1239. extern struct drm_mm_node *drm_mm_get_block(struct drm_mm_node * parent,
  1240.                        unsigned long size,
  1241.                        unsigned alignment);
  1242. extern void drm_mm_put_block(struct drm_mm_node * cur);
  1243. extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, unsigned long size,
  1244.                      unsigned alignment, int best_match);
  1245. extern int drm_mm_init(struct drm_mm *mm, unsigned long start, unsigned long size);
  1246. extern void drm_mm_takedown(struct drm_mm *mm);
  1247. extern int drm_mm_clean(struct drm_mm *mm);
  1248. extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
  1249. extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, unsigned long size);
  1250. extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size);
  1251.  
  1252. /* Graphics Execution Manager library functions (drm_gem.c) */
  1253. int drm_gem_init(struct drm_device *dev);
  1254. void drm_gem_object_free(struct kref *kref);
  1255. struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
  1256.                         size_t size);
  1257. void drm_gem_object_handle_free(struct kref *kref);
  1258.  
  1259. static inline void
  1260. drm_gem_object_reference(struct drm_gem_object *obj)
  1261. {
  1262.     kref_get(&obj->refcount);
  1263. }
  1264.  
  1265. static inline void
  1266. drm_gem_object_unreference(struct drm_gem_object *obj)
  1267. {
  1268.     if (obj == NULL)
  1269.         return;
  1270.  
  1271.     kref_put(&obj->refcount, drm_gem_object_free);
  1272. }
  1273.  
  1274. int drm_gem_handle_create(struct drm_file *file_priv,
  1275.               struct drm_gem_object *obj,
  1276.               int *handlep);
  1277.  
  1278. static inline void
  1279. drm_gem_object_handle_reference(struct drm_gem_object *obj)
  1280. {
  1281.     drm_gem_object_reference(obj);
  1282.     kref_get(&obj->handlecount);
  1283. }
  1284.  
  1285. static inline void
  1286. drm_gem_object_handle_unreference(struct drm_gem_object *obj)
  1287. {
  1288.     if (obj == NULL)
  1289.         return;
  1290.  
  1291.     /*
  1292.      * Must bump handle count first as this may be the last
  1293.      * ref, in which case the object would disappear before we
  1294.      * checked for a name
  1295.      */
  1296.     kref_put(&obj->handlecount, drm_gem_object_handle_free);
  1297.     drm_gem_object_unreference(obj);
  1298. }
  1299.  
  1300. struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
  1301.                          struct drm_file *filp,
  1302.                          int handle);
  1303. int drm_gem_close_ioctl(struct drm_device *dev, void *data,
  1304.             struct drm_file *file_priv);
  1305. int drm_gem_flink_ioctl(struct drm_device *dev, void *data,
  1306.             struct drm_file *file_priv);
  1307. int drm_gem_open_ioctl(struct drm_device *dev, void *data,
  1308.                struct drm_file *file_priv);
  1309. void drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
  1310. void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
  1311.  
  1312. extern void drm_core_ioremap(struct drm_map *map, struct drm_device *dev);
  1313. extern void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev);
  1314. extern void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev);
  1315.  
  1316. static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev,
  1317.                            unsigned int token)
  1318. {
  1319.     struct drm_map_list *_entry;
  1320.     list_for_each_entry(_entry, &dev->maplist, head)
  1321.         if (_entry->user_token == token)
  1322.         return _entry->map;
  1323.     return NULL;
  1324. }
  1325.  
  1326. static __inline__ int drm_device_is_agp(struct drm_device *dev)
  1327. {
  1328.     if (dev->driver->device_is_agp != NULL) {
  1329.         int err = (*dev->driver->device_is_agp) (dev);
  1330.  
  1331.         if (err != 2) {
  1332.             return err;
  1333.         }
  1334.     }
  1335.  
  1336.     return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
  1337. }
  1338.  
  1339. static __inline__ int drm_device_is_pcie(struct drm_device *dev)
  1340. {
  1341.     return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
  1342. }
  1343.  
  1344. static __inline__ void drm_core_dropmap(struct drm_map *map)
  1345. {
  1346. }
  1347.  
  1348. #ifndef DEBUG_MEMORY
  1349. /** Wrapper around kmalloc() */
  1350. static __inline__ void *drm_alloc(size_t size, int area)
  1351. {
  1352.     return kmalloc(size, GFP_KERNEL);
  1353. }
  1354.  
  1355. /** Wrapper around kfree() */
  1356. static __inline__ void drm_free(void *pt, size_t size, int area)
  1357. {
  1358.     kfree(pt);
  1359. }
  1360.  
  1361. /** Wrapper around kcalloc() */
  1362. static __inline__ void *drm_calloc(size_t nmemb, size_t size, int area)
  1363. {
  1364.     return kcalloc(nmemb, size, GFP_KERNEL);
  1365. }
  1366. #else
  1367. extern void *drm_alloc(size_t size, int area);
  1368. extern void drm_free(void *pt, size_t size, int area);
  1369. extern void *drm_calloc(size_t nmemb, size_t size, int area);
  1370. #endif
  1371.  
  1372. /*@}*/
  1373.  
  1374. #endif                /* __KERNEL__ */
  1375. #endif
  1376.